home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / program / tcpdumpb.zip / libpcap / gencode.h < prev    next >
C/C++ Source or Header  |  1996-07-17  |  5KB  |  180 lines

  1. /*
  2.  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  * @(#) $Header: gencode.h,v 1.36 96/07/17 00:11:34 leres Exp $ (LBL)
  22.  */
  23.  
  24. /*XXX*/
  25. #include "gnuc.h"
  26.  
  27. /* Address qualifiers. */
  28.  
  29. #define Q_HOST        1
  30. #define Q_NET        2
  31. #define Q_PORT        3
  32. #define Q_GATEWAY    4
  33. #define Q_PROTO        5
  34.  
  35. /* Protocol qualifiers. */
  36.  
  37. #define Q_LINK        1
  38. #define Q_IP        2
  39. #define Q_ARP        3
  40. #define Q_RARP        4
  41. #define Q_TCP        5
  42. #define Q_UDP        6
  43. #define Q_ICMP        7
  44. #define Q_IGMP        8
  45. #define Q_IGRP        9
  46.  
  47.  
  48. #define    Q_ATALK        10
  49. #define    Q_DECNET    11
  50. #define    Q_LAT        12
  51. #define Q_SCA        13
  52. #define    Q_MOPRC        14
  53. #define    Q_MOPDL        15
  54.  
  55. /* Directional qualifiers. */
  56.  
  57. #define Q_SRC        1
  58. #define Q_DST        2
  59. #define Q_OR        3
  60. #define Q_AND        4
  61.  
  62. #define Q_DEFAULT    0
  63. #define Q_UNDEF        255
  64.  
  65. struct stmt {
  66.     int code;
  67.     bpf_int32 k;
  68. };
  69.  
  70. struct slist {
  71.     struct stmt s;
  72.     struct slist *next;
  73. };
  74.  
  75. /* 
  76.  * A bit vector to represent definition sets.  We assume TOT_REGISTERS
  77.  * is smaller than 8*sizeof(atomset).
  78.  */
  79. typedef bpf_u_int32 atomset;
  80. #define ATOMMASK(n) (1 << (n))
  81. #define ATOMELEM(d, n) (d & ATOMMASK(n))
  82.  
  83. /*
  84.  * An unbounded set.
  85.  */
  86. typedef bpf_u_int32 *uset;
  87.  
  88. /*
  89.  * Total number of atomic entities, including accumulator (A) and index (X).
  90.  * We treat all these guys similarly during flow analysis.
  91.  */
  92. #define N_ATOMS (BPF_MEMWORDS+2)
  93.  
  94. struct edge {
  95.     int id;
  96.     int code;
  97.     uset edom;
  98.     struct block *succ;
  99.     struct block *pred;
  100.     struct edge *next;    /* link list of incoming edges for a node */
  101. };
  102.  
  103. struct block {
  104.     int id;
  105.     struct slist *stmts;    /* side effect stmts */
  106.     struct stmt s;        /* branch stmt */
  107.     int mark;
  108.     int longjt;        /* jt branch requires long jump */
  109.     int longjf;        /* jf branch requires long jump */
  110.     int level;
  111.     int offset;
  112.     int sense;
  113.     struct edge et;
  114.     struct edge ef;
  115.     struct block *head;
  116.     struct block *link;    /* link field used by optimizer */
  117.     uset dom;
  118.     uset closure;
  119.     struct edge *in_edges;
  120.     atomset def, kill;
  121.     atomset in_use;
  122.     atomset out_use;
  123.     int oval;
  124.     int val[N_ATOMS];
  125. };
  126.  
  127. struct arth {
  128.     struct block *b;    /* protocol checks */
  129.     struct slist *s;    /* stmt list */
  130.     int regno;        /* virtual register number of result */
  131. };
  132.  
  133. struct qual {
  134.     unsigned char addr;
  135.     unsigned char proto;
  136.     unsigned char dir;
  137.     unsigned char pad;
  138. };
  139.  
  140. struct arth *gen_loadi(int);
  141. struct arth *gen_load(int, struct arth *, int);
  142. struct arth *gen_loadlen(void);
  143. struct arth *gen_neg(struct arth *);
  144. struct arth *gen_arth(int, struct arth *, struct arth *);
  145.  
  146. void gen_and(struct block *, struct block *);
  147. void gen_or(struct block *, struct block *);
  148. void gen_not(struct block *);
  149.  
  150. struct block *gen_scode(const char *, struct qual);
  151. struct block *gen_ecode(const u_char *, struct qual);
  152. struct block *gen_mcode(const char *, const char *, int, struct qual);
  153. struct block *gen_ncode(const char *, bpf_u_int32, struct qual);
  154. struct block *gen_proto_abbrev(int);
  155. struct block *gen_relation(int, struct arth *, struct arth *, int);
  156. struct block *gen_less(int);
  157. struct block *gen_greater(int);
  158. struct block *gen_byteop(int, int, int);
  159. struct block *gen_broadcast(int);
  160. struct block *gen_multicast(int);
  161. struct block *gen_inbound(int);
  162.  
  163. void bpf_optimize(struct block **);
  164. #if __STDC__
  165. __dead void bpf_error(const char *, ...)
  166.     __attribute__((volatile, format (printf, 1, 2)));
  167. #endif
  168.  
  169. void finish_parse(struct block *);
  170. char *sdup(const char *);
  171.  
  172. struct bpf_insn *icode_to_fcode(struct block *, int *);
  173. int pcap_parse(void);
  174. void lex_init(char *);
  175. void sappend(struct slist *, struct slist *);
  176.  
  177. /* XXX */
  178. #define JT(b)  ((b)->et.succ)
  179. #define JF(b)  ((b)->ef.succ)
  180.